#ifndef		_BSP_LED_H
#define		_BSP_LED_H
#include "stm32f10x.h"
//使用宏的好处就是，一处修改，处处修改
/***************************LED灯引脚宏定义******************************(与硬件打交道)*/
//SI4438_SUCC
#define	SI4438_SUCC_GPIO_PORT			GPIOB    //这里是一个结构体指针
#define	SI4438_SUCC_GPIO_CLK			RCC_APB2Periph_GPIOB   //这个宏，库函数中有
#define	SI4438_SUCC_GPIO_PIN			GPIO_Pin_3

//SI4438_FAILURE
#define	SI4438_FAILURE_GPIO_PORT		GPIOB    //这里是一个结构体指针
#define	SI4438_FAILURE_GPIO_CLK		RCC_APB2Periph_GPIOB   //这个宏，库函数中有
#define	SI4438_FAILURE_GPIO_PIN		GPIO_Pin_2

//RA2_SUCC
#define	RA2_SUCC_GPIO_PORT			GPIOB    //这里是一个结构体指针
#define	RA2_SUCC_GPIO_CLK			RCC_APB2Periph_GPIOB   //这个宏，库函数中有
#define	RA2_SUCC_GPIO_PIN			GPIO_Pin_1

//RA2_FAILURE
#define	RA2_FAILURE_PORT			GPIOB    //这里是一个结构体指针
#define	RA2_FAILURE_CLK				RCC_APB2Periph_GPIOB   //这个宏，库函数中有
#define	RA2_FAILURE_PIN				GPIO_Pin_0

//以上代码将，LED灯的GPIO端口，GPIO引脚，GPIO端口时钟封装起来，以达到应用代码与硬件无关的效果



/**************************LED灯亮灭的宏定义*****************************(与驱动硬件的方法打交道)*******/
//直接操作寄存器的方法控制IO   这里的i即任意GPIO_Pin_x (x=0..15)的组合
#define	digitalHi(p,i)		{p->BSRR=i;}     //(输出电平为高)这种宏定义的方法
#define	digitalLo(p,i)		{p->BRR=i;}     //输出电平为低
#define	digitalToggle(p,i)	{p->ODR^=i;}    //与1异或即取反


//																		(业物逻辑层)
//定义控制IO的宏   (要一层一层的封装)
#define	SI4438_SUCC_TOGGLE		digitalToggle(SI4438_SUCC_GPIO_PORT,SI4438_SUCC_GPIO_PIN)   //只是SI4438_SUCC的       
#define	SI4438_SUCC_OFF		digitalHi(SI4438_SUCC_GPIO_PORT,SI4438_SUCC_GPIO_PIN) 
#define	SI4438_SUCC_ON			digitalLo(SI4438_SUCC_GPIO_PORT,SI4438_SUCC_GPIO_PIN) 

#define	SI4438_FAILURE_TOGGLE		digitalToggle(SI4438_FAILURE_GPIO_PORT,SI4438_FAILURE_GPIO_PIN)   //只是SI4438_FAILURE的  
#define	SI4438_FAILURE_OFF		digitalHi(SI4438_FAILURE_GPIO_PORT,SI4438_FAILURE_GPIO_PIN) 
#define	SI4438_FAILURE_ON			digitalLo(SI4438_FAILURE_GPIO_PORT,SI4438_FAILURE_GPIO_PIN) 

#define	RA2_SUCC_TOGGLE		digitalToggle(RA2_SUCC_GPIO_PORT,RA2_SUCC_GPIO_PIN)            //只是RA2_SUCC的    
#define	RA2_SUCC_OFF		digitalHi(RA2_SUCC_GPIO_PORT,RA2_SUCC_GPIO_PIN) 
#define	RA2_SUCC_ON			digitalLo(RA2_SUCC_GPIO_PORT,RA2_SUCC_GPIO_PIN) 

#define	RA2_FAILURE_TOGGLE		digitalToggle(RA2_FAILURE_PORT,RA2_FAILURE_PIN)            //RA2_FAILURE    
#define	RA2_FAILURE_OFF		digitalHi(RA2_FAILURE_PORT,RA2_FAILURE_PIN) 
#define	RA2_FAILURE_ON			digitalLo(RA2_FAILURE_PORT,RA2_FAILURE_PIN) 


/****************下面定义一下位带操作相关的宏****************(现在是4个字节控制一个bit)**/
//把"位带地址+位序号"转换成别名区地址的宏
#define BITBAND(addr,bitnum)	((addr&0xF0000000)+0x02000000+((addr&0x00FFFFFF)<<5)+(bitnum<<2))  //宏定义时要格外注意括号的使用
//将一个立即数转换成对应的寄存器
#define	MEM_ADDR(addr)	*((volatile uint32_t *)(addr))    //立即数->地址变量->相应的寄存器
//上面的组合	利用位带别名区实现对位带的访问
#define	BIT_ADDR(addr,bitnum)	MEM_ADDR(BITBAND(addr,bitnum))

//GPIO  ODR 和  IDR寄存器地址映射
#define	GPIOA_ODR_Addr	(GPIOA_BASE+12)         //GPIOx_BASE (x=A...G)库函数里有定义
#define	GPIOB_ODR_Addr	(GPIOB_BASE+12)  
#define	GPIOC_ODR_Addr	(GPIOC_BASE+12)  
#define	GPIOD_ODR_Addr	(GPIOD_BASE+12)  
#define	GPIOE_ODR_Addr	(GPIOE_BASE+12)  
#define	GPIOF_ODR_Addr	(GPIOF_BASE+12)  
#define	GPIOG_ODR_Addr	(GPIOG_BASE+12)  

#define	GPIOA_IDR_Addr	(GPIOA_BASE+8)
#define	GPIOB_IDR_Addr	(GPIOB_BASE+8)
#define	GPIOC_IDR_Addr	(GPIOC_BASE+8)
#define	GPIOD_IDR_Addr	(GPIOD_BASE+8)
#define	GPIOE_IDR_Addr	(GPIOE_BASE+8)
#define	GPIOF_IDR_Addr	(GPIOF_BASE+8)
#define	GPIOG_IDR_Addr	(GPIOG_BASE+8)

//GPIO位操作,单独操作GPIO的某一个IO口
#define	PAOut(n)	BIT_ADDR(GPIOA_ODR_Addr,n)
#define	PAIn(n)		BIT_ADDR(GPIOA_IDR_Addr,n)

#define	PBOut(n)	BIT_ADDR(GPIOB_ODR_Addr,n)
#define	PBIn(n)		BIT_ADDR(GPIOB_IDR_Addr,n)

#define	PCOut(n)	BIT_ADDR(GPIOC_ODR_Addr,n)
#define	PCIn(n)		BIT_ADDR(GPIOC_IDR_Addr,n)

#define	PDOut(n)	BIT_ADDR(GPIOD_ODR_Addr,n)
#define	PDIn(n)		BIT_ADDR(GPIOD_IDR_Addr,n)

#define	PEOut(n)	BIT_ADDR(GPIOE_ODR_Addr,n)
#define	PEIn(n)		BIT_ADDR(GPIOE_IDR_Addr,n)

#define	PFOut(n)	BIT_ADDR(GPIOF_ODR_Addr,n)
#define	PFIn(n)		BIT_ADDR(GPIOF_IDR_Addr,n)

#define	PGOut(n)	BIT_ADDR(GPIOG_ODR_Addr,n)
#define	PGIn(n)		BIT_ADDR(GPIOG_IDR_Addr,n)

void  LED_TX_Action(void);
void  LED_RX_Action(void);
void  LED_Action(void);
void LED_GPIO_Config(void);


#endif

